﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TankController.Dominio;

namespace TankController
{
    public partial class UcConfigurarSeguidorReferencia : UserControl
    {
        private FormConfigurar formConfigurar;
        private SeguidorReferencia seguidor;

        public SeguidorReferencia Controlador
        {
            get { return seguidor; }
        }

        public UcConfigurarSeguidorReferencia()
        {
            InitializeComponent();
        }

        public UcConfigurarSeguidorReferencia(FormConfigurar formConfigurar)
            : this()
        {
            this.formConfigurar = formConfigurar;
        }

        public void ValidarCampos()
        {
            int parseResultInt;
            double parseResultDouble;

            if (!int.TryParse(txtPeriodoControlador.Text, out parseResultInt))
            {
                throw new ApplicationException("Valor de período do controlador inválido.");
            }

            if (!double.TryParse(txtLimiteSeguranca.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor de limite de segurança do controlador inválido.");
            }

            if (rbtK1.Checked && !double.TryParse(txtK1.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor de K1 inválido.");
            }

            if (rbtP1.Checked && !double.TryParse(txtP1Real.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor da parte real de P1 inválido.");
            }

            if (rbtP1.Checked && !double.TryParse(txtP1Imaginario.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor da parte imaginária de P1 inválido.");
            }

            if (rbtK2.Checked && !double.TryParse(txtK2.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor de K2 inválido.");
            }

            if (rbtP2.Checked && !double.TryParse(txtP2Real.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor da parte real de P2 inválido.");
            }

            if (rbtP2.Checked && !double.TryParse(txtP2Imaginario.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor da parte imaginária de P2 inválido.");
            }

            if (rbtK3.Checked && !double.TryParse(txtK3.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor de K3 inválido.");
            }

            if (rbtP3.Checked && !double.TryParse(txtP3.Text.Replace('.', ','), out parseResultDouble))
            {
                throw new ApplicationException("Valor de P3 inválido.");
            }

            if ((rbtP1.Checked && rbtP2.Checked) &&
                (!"0".Equals(txtP1Imaginario.Text.Trim()) || !"0".Equals(txtP2Imaginario.Text.Trim())) &&
                (!txtP1Imaginario.Text.Trim().Equals(txtP2Imaginario.Text.Trim()) || 
                (!txtP1Real.Text.Trim().Equals(txtP2Real.Text.Trim()))))
            {
                throw new ApplicationException("Se P1 e/ou P2 forem números imaginários, eles devem ser complexos conjugados.");
            }
        }

        public void MontarControlador()
        {
            int periodo = int.Parse(txtPeriodoControlador.Text);
            double limiteSeguranca = double.Parse(txtLimiteSeguranca.Text.Replace('.', ',')) / 100;

            seguidor = Global.Controlador1 as SeguidorReferencia;

            if (seguidor == null)
            {
                seguidor = new SeguidorReferencia();
            }

            if (rbtK1.Checked && rbtK2.Checked && rbtK3.Checked)
            {
                double k1 = 0;
                double k2 = 0;
                double k3 = 0;

                k1 = double.Parse(txtK1.Text.Replace('.', ','));
                k2 = double.Parse(txtK2.Text.Replace('.', ','));
                k3 = double.Parse(txtK3.Text.Replace('.', ','));

                seguidor.SetGanhos(k1, k2, k3);
            }
            else
            {
                Complexo p1 = new Complexo();
                Complexo p2 = new Complexo();
                Complexo p3 = new Complexo();

                p1.Real = double.Parse(txtP1Real.Text.Replace('.', ','));
                p2.Real = double.Parse(txtP2Real.Text.Replace('.', ','));
                p3.Real = double.Parse(txtP3.Text.Replace('.', ','));

                p1.Imaginario = double.Parse(txtP1Imaginario.Text.Replace('.', ','));
                p2.Imaginario = -double.Parse(txtP2Imaginario.Text.Replace('.', ','));
                p3.Imaginario = 0;

                seguidor.SetPolos(p1, p2, p3);
            }

            seguidor.Periodo = periodo;
            seguidor.LimiteSeguranca = limiteSeguranca;
        }

        public void AtualizarCampos()
        {
            seguidor = Global.Controlador1 as SeguidorReferencia;
            Boolean configuraK = Global.ConfiguraK;

            if (configuraK)
            {
                rbtK1.Checked = true;
                txtP1Real.Text = seguidor.P1.Real.ToString();
                txtP1Imaginario.Text = Math.Abs(seguidor.P1.Imaginario).ToString();
                txtK1.Text = seguidor.K1.ToString();

                rbtK2.Checked = true;
                txtP2Real.Text = seguidor.P2.Real.ToString();
                txtP2Imaginario.Text = Math.Abs(seguidor.P2.Imaginario).ToString();
                txtK2.Text = seguidor.K2.ToString();

                rbtK3.Checked = true;
                txtP3.Text = seguidor.P3.Real.ToString();
                txtK3.Text = seguidor.K3.ToString();
            }
            else
            {
                rbtP1.Checked = true;
                txtK1.Text = seguidor.K1.ToString();
                txtP1Real.Text = seguidor.P1.Real.ToString();
                txtP1Imaginario.Text = Math.Abs(seguidor.P1.Imaginario).ToString();

                rbtP2.Checked = true;
                txtK2.Text = seguidor.K2.ToString();
                txtP2Real.Text = seguidor.P2.Real.ToString();
                txtP2Imaginario.Text = Math.Abs(seguidor.P2.Imaginario).ToString();

                rbtP3.Checked = true;
                txtK3.Text = seguidor.K3.ToString();
                txtP3.Text = seguidor.P3.Real.ToString();
            }
        }

        private void rbtGanhosPolos_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rbtGanhoPolo = sender as RadioButton;

            if (rbtGanhoPolo.Checked)
            {
                if (rbtGanhoPolo.Text.StartsWith("K"))
                {
                    txtK1.Enabled = true;
                    txtK2.Enabled = true;
                    txtK3.Enabled = true;

                    txtP1Real.Enabled = false;
                    txtP1Imaginario.Enabled = false;
                    txtP2Real.Enabled = false;
                    txtP2Imaginario.Enabled = false;
                    txtP3.Enabled = false;

                    rbtK1.Checked = true;
                    rbtK2.Checked = true;
                    rbtK3.Checked = true;

                    Global.ConfiguraK = true;
                }
                else
                {
                    txtK1.Enabled = false;
                    txtK2.Enabled = false;
                    txtK3.Enabled = false;

                    txtP1Real.Enabled = true;
                    txtP1Imaginario.Enabled = true;
                    txtP2Real.Enabled = true;
                    txtP2Imaginario.Enabled = true;
                    txtP3.Enabled = true;

                    rbtP1.Checked = true;
                    rbtP2.Checked = true;
                    rbtP3.Checked = true;

                    Global.ConfiguraK = false;
                }
            }
        }

        private void txtPImaginario_TextChanged(object sender, EventArgs e)
        {
            TextBox txtPImaginario = sender as TextBox;

            if (sender == txtP1Imaginario)
            {
                txtP2Imaginario.Text = txtP1Imaginario.Text;
            }
            else
            {
                txtP1Imaginario.Text = txtP2Imaginario.Text;
            }
        }
    }
}
